/********************************************************************************
 *      Copyright:  (C) 2025 YANG Studio
 *                  All rights reserved.
 *
 *       Filename:  esp8266.h
 *    Description:  This file 
 *
 *        Version:  1.0.0(27/05/25)
 *         Author:  YANG JIAYU <yangjiayu@gmail.com>
 *      ChangeLog:  1, Release initial version on "27/05/25 19:19:22"
 *                 
 ********************************************************************************/
#ifndef __ESP8266_H            // 预编译保护宏，防止头文件重复包含
#define __ESP8266_H

#include "./SYSTEM/usart/usart.h"  // 包含串口通信头文件（用于ESP8266通信）
#include "./SYSTEM/sys/sys.h"      // 包含系统基础头文件（提供时钟使能等功能）


/* 功能函数声明（按功能模块分组注释） */

/**
 * @brief       初始化ESP8266模块（发送基础AT命令）
 * @retval      0: 初始化失败  1: 初始化成功
 */
uint8_t ESP8266_Init(void);

/**
 * @brief       连接WiFi网络（STA模式）
 * @param       ssid: WiFi名称指针
 * @param       pwd: WiFi密码指针
 * @retval      0: 连接失败  1: 连接成功（获取到IP地址）
 */
uint8_t ESP8266_ConnectWiFi(char *ssid, char *pwd);

/**
 * @brief       连接TCP/UDP服务器
 * @param       type: 连接类型字符串（"TCP"或"UDP"）
 * @param       ip: 服务器IP地址指针
 * @param       port: 服务器端口号
 * @retval      0: 连接失败  1: 连接成功
 */
uint8_t ESP8266_ConnectServer(char *type, char *ip, uint16_t port);

/**
 * @brief       向服务器发送数据（支持透传模式）
 * @param       data: 发送数据指针（uint8_t类型）
 * @param       len: 数据长度（最大2048字节）
 * @retval      0: 发送失败  1: 发送成功
 */
uint8_t ESP8266_SendData(uint8_t *data, uint16_t len);

/**
 * @brief       检查服务器连接状态
 * @retval      1: 已连接  0: 未连接
 */
uint8_t ESP8266_CheckStatus(void);

/**
 * @brief       处理ESP8266接收数据（解析命令）
 * @note        需在主循环中周期性调用，用于响应服务器命令
 */
void ESP8266_Process(void);


/* 底层命令交互函数（供内部调用） */

/**
 * @brief       发送AT命令并等待响应（核心通信函数）
 * @param       cmd: AT命令字符串（NULL表示仅等待响应）
 * @param       resp: 期望的响应字符串（NULL表示任意响应）
 * @param       timeout: 超时时间（毫秒）
 * @retval      1: 收到期望响应  0: 超时未收到响应
 */
uint8_t ESP8266_Cmd(char *cmd, char *resp, uint32_t timeout);

#endif  /* __ESP8266_H */  // 预编译保护宏结束

